package com.station.Activitys.adapter;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;

import com.station.Activitys.R;
import com.station.Activitys.activity.ViewPictureActivity;
import com.station.Activitys.adapter.base.BaseRecyclerViewAdapter;
import com.station.Activitys.bean.ImageJson;
import com.station.Activitys.bean.ImageMag;
import com.station.Activitys.other.matisse.GifSizeFilter;
import com.station.Activitys.other.matisse.Glide4Engine;
import com.station.Activitys.utils.Constant;
import com.station.Activitys.utils.JumperUtils;
import com.zhihu.matisse.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.filter.Filter;
import com.zhihu.matisse.internal.entity.CaptureStrategy;
import com.zhy.autolayout.utils.AutoUtils;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;

/**
 * 项目名称：基站管理平台 手机app
 * 类描述：图片上传 管理者 适配器
 * 创建人：张飞祥
 * 创建时间：2018/9/27 8:26
 * 修改人：张飞祥
 * 修改时间：2018/9/27 8:26
 * 修改备注：
 */
public abstract class ImageMagAdapter extends BaseRecyclerViewAdapter {

    //上下文
    private Context context;
    //数据实体类
    private List<ImageMag> list;

    /**
     * 数据 构造方法
     *
     * @param context
     * @param list
     */
    public ImageMagAdapter(Context context, List<ImageMag> list) {
        super(context, list);
        this.context = context;
        this.list = list;
    }

    @Override
    protected int getLayoutItemResId() {
        return R.layout.item_image_mag;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
        //  viewHolder
        final ImageMagViewHolder holder = (ImageMagViewHolder) viewHolder;
        //  View 非空判断
        if (holder.itemView != null) {

            /**
             * 解决 editText 数据混乱问题
             */
            //1、为了避免TextWatcher在第2步被调用，提前将他移除。
            if (holder.etItemName.getTag() instanceof TextWatcher) {
                holder.etItemName.removeTextChangedListener((TextWatcher) holder.etItemName.getTag());
            }
            // 第2步：移除TextWatcher之后，设置EditText的Text。
            holder.etItemName.setText(list.get(position).getName());
            TextWatcher watcher = new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                }

                @Override
                public void afterTextChanged(Editable editable) {
                    if (TextUtils.isEmpty(editable.toString())) {
                        list.get(position).setName("");
                    } else {
                        list.get(position).setName(editable.toString());
                    }
                }
            };
            holder.etItemName.addTextChangedListener(watcher);
            holder.etItemName.setTag(watcher);

            //TODO 删除某一组
            holder.ivItemDel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    removeItem(position);
                }
            });

            //TODO 初始化 子类 adapter
            // 获取当前 本地 路径 集合
            final List<String> mPicList = list.get(position).getLocalImgList();
            // 获取当前 网络 路径 集合
            final List<String> mHttpList = list.get(position).getHttpImgList();
            //上传图片 的 Flag （true：当前位置可以继续上传，false：当前位置不可以上传了）
            List<Boolean> mHttpImgFlag = list.get(position).getHttpImgFlag();
            //实例化 adapter
            final ImageUploadAdapter mAdapter = new ImageUploadAdapter(context,mPicList,mHttpList,mHttpImgFlag) {
                @Override
                public void delImage(int pos, List<String> httpList) {
                    //删除本地图片数据
                    list.get(position).getLocalImgList().remove(pos);
                    //删除子控制器img
                    setDeleteItemImg(pos);

                }
            };
            //这里是设置为网格布局，后边4的参数是列数
            holder.rvItemImgList.setLayoutManager(new GridLayoutManager(context, 3));
            //设置 适配器 到控件上
            holder.rvItemImgList.setAdapter(mAdapter);

            /**
             * 设置 图片点击事件
             */
            mAdapter.setOnItemClickListener(new BaseRecyclerViewAdapter.OnRecyclerViewItemClickListener() {
                @Override
                public void onItemClick(View view, int pos) {

                    //总张数
                    int count = Constant.MAX_SELECT_PIC_NUM;
                    //当前选择集合数
                    int size = mPicList.size();
                    //还可以传入 多少图片
                    int surplus = count - size;
                    //真正 选择的 数量
                    int sum;

                    //TODO 业务逻辑判断
                    if (pos == mAdapter.getItemCount() - 1) {
                        //如果“增加按钮形状的”图片的位置是最后一张，且添加了的图片的数量不超过最大值，才能点击
                        if (size == count) {
                            //最多添加最大值张图片
                            viewPluImg(pos, mPicList);
                        } else {

                            if (surplus > 6 && surplus % 6 <= 6 || size == 0)
                                sum = 6;
                            else
                                sum = (count - size);

                            //添加图片
                            getImageFromPhoto(sum);
                            //开始上传图片 的位置
                            setImageUploadPos(position);
                        }
                    } else {
                        viewPluImg(pos, mPicList);
                    }
                }
            });
            //填充 adapter
            list.get(position).setAdapter(mAdapter);
        }

    }

    /**
     * 调用手机相机
     */
    private void getImageFromPhoto(int count) {
        /**
         * 动态申请权限 否则不调用相机
         *
         * true： --------> 让用户手动设置 给予权限
         * false：--------> 跳转图片选择页面
         *
         */
        String[] PERMISSIONS_STORAGE = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA,
                Manifest.permission.WRITE_SETTINGS
        };
        int permission = ActivityCompat.checkSelfPermission((Activity) context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions((Activity) context, PERMISSIONS_STORAGE, Constant.REQUEST_EXTERNAL_STORAGE);
        } else {
            Matisse.from((Activity) context)
                    .choose(MimeType.ofImage())
                    .countable(true)
                    .capture(true)
                    .captureStrategy(
                            new CaptureStrategy(true, Constant.APP_FILE_PATH))
                    .maxSelectable(count)
                    .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
                    .gridExpectedSize(context.getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
                    .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
                    .thumbnailScale(0.85f)
                    .imageEngine(new Glide4Engine())
                    .forResult(Constant.REQUEST_CAMERA_PHOTO);
        }
    }

    /**
     * 查看图片缩略图
     *
     * @param position
     */
    private void viewPluImg(int position,List<String> mPicList) {
        Bundle bundle = new Bundle();
        //TODO 传递 当前图片 数据
        //设置 是否可以删除 tag
        bundle.putBoolean(Constant.INTENT_IMAGE_DELETE_TAG, false);
        //设置 图片标志位
        bundle.putInt(Constant.INTENT_IMAGE_POS, position);
        //设置 图片加载方式 （本地图片）
        bundle.putString(Constant.INTENT_IMAGE_LOAD_TAG, Constant.IMAGE_LOAD_LOCAL);
        //设置 图片路径
        bundle.putStringArrayList(Constant.INTENT_IMAGE_URL_LIST, (ArrayList<String>) mPicList);
        //跳转 查看图片页面
        JumperUtils.JumpTo((Activity) context, ViewPictureActivity.class, bundle);
    }


    /**
     * 给外部提供一个 获取当前 数据集合 方法
     */
    public List<ImageMag> getImageMags() {
        return list;
    }

    /**
     * 提供 给外部 当前那个 开始上传图片 的位置
     * @param position
     */
    public abstract void setImageUploadPos(int position);

    @Override
    public RecyclerView.ViewHolder getViewHolder(View view) {
        return new ImageMagViewHolder(view);
    }

    /**
     * 给外部提供一个 获取需要上传 到服务器 上的 数据集合 方法
     */
    public List<ImageJson> getUploadImgList() {

        List<ImageJson> imgList = new ArrayList<>();

        ImageJson img = null;

        for (int i = 0;i<list.size();i++){
            img = new ImageJson();
            img.setImgCategorys(list.get(i).getName());
            img.setImgs(list.get(i).getAdapter().getHttpUrls());

            imgList.add(img);
        }
        return imgList;
    }

    /**
     * 添加一条数据
     * @param position
     * @param mag
     */
    public void addItem(int position,ImageMag mag) {
        //在list中添加数据，并通知条目加入一条
        list.add(position, mag);
        //添加动画
        notifyDataSetChanged();
    }

    /**
     * 删除某一个
     * @param position
     */
    public void removeItem(int position) {
        list.remove(position);
        //刷新视图
        notifyDataSetChanged();
    }

    /**
     * ViewHolder
     */
    public class ImageMagViewHolder extends RecyclerView.ViewHolder {

        //分组名称
        @Bind(R.id.et_item_name) EditText etItemName;
        //删除按钮
        @Bind(R.id.iv_item_del) ImageView ivItemDel;
        //图片上传列表
        @Bind(R.id.rv_item_img_list) RecyclerView rvItemImgList;

        public ImageMagViewHolder(View itemView) {
            super(itemView);
            //初始化 控件绑定
            ButterKnife.bind(this, itemView);
            //初始化 屏幕适配
            AutoUtils.autoSize(itemView);
        }
    }
}
